#!/usr/bin/env python
# -*- coding:utf-8 -*-

from django import template

register = template.Library()

'''遍历已有字典的每个元素（也是字典，但只是第一层，{A:{},B:{}}），用当前评论去比对：
如果这个元素（字典）的key值是它的parent_comment，那么就在这个字典里插入当前评论，
key是当前对象，value是{}（可能有下级评论），插入完成后，代表这个评论已经找到了自己的位置，直接退出；
但是若没找到位置，就去匹配comment_dic的下一层comment_dic[k]，
还没有就继续找，直到找到这个评论的位置。
简化：用递归的方式，将参数传给自己，就是找下一层的代码'''
def tree_search(d_dic,comment_obj):
    for k,v_dic in d_dic.items():
        if k == comment_obj.parent_comment:
            d_dic[k][comment_obj] = {}
            return
        else:
            tree_search(d_dic[k],comment_obj)

'''子评论的html初始为空，第一条子评论生成距左边框15px的html，然后下一级也是生成同样的html，只不过左边距又增加15px，
子评论每加一级，与左边框的距离就要多15px，这样才有分级的效果，
没到下一级评论，都是执行和第一条一样的代码，所以用递归函数简化，生成总的子评论html后return给顶级评论去处理'''
def generate_comment_html(sub_comment_dic,margin_left_val):
    html = ""
    for k,v_dic in sub_comment_dic.items():
        html += "<div style='margin-left:%spx' class='comment-node'>" % margin_left_val + k.comment + "</div>"
        if v_dic:
            html += generate_comment_html(v_dic,margin_left_val+15)
    return html

'''多级评论
前端收到一个评论列表，[（评论，父级评论）,...]
把它处理成一个分级字典{A:{a2:{a3:{}}},B:{b1:{}}}'''
@register.simple_tag
def comment_list_to_dic(comment_list):
    comment_dic = {}
    for comment_obj in comment_list:
        '''每一个评论是一个对象，首先判断自己是不是顶层评论，也就是parent_comment为null，那么就把它加进字典里，值为空字典；
        如果它有parent_comment，那他就是子评论，去调用另一个函数tree_search，参数是刚才得到的带有顶级评论的字典和这个评论对象；  '''
        if comment_obj.parent_comment is None:
            comment_dic[comment_obj] ={}    #找出最顶层评论
        else:
            tree_search(comment_dic,comment_obj)
    '''comment_dic = {字典评论树已经建成}，这个字典里都是对象组成的key和value，不是真正的值哦；
    直接把这个字典传到前端处理不了，因为不知道他是哪一级，也不知道有多少级，所以只能拼好html传给前端；
    先处理顶层评论，顶层评论的内容加到html里，后面的子评论交给另一个函数来处理，把当前这个顶级评论的html
    和子级评论处理函数的返回值拼接成完整的html，返回给前端simple_tag'''
    html = "<div class='comment-box'>"
    margin_left = 0
    for k,v in comment_dic.items():
        print(k,v )
        html += "<div class='comment-node'>" + k.comment + "</div>"   #顶层评论div
        html += generate_comment_html(v,margin_left+15)     #子层评论

    html += "</div>"
    return html
